<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
      /*   Object.defineProperties(object, descriptors)对某个对象进行多个属性的统一定义功能描述
            object：将要添加属性的目标对象
            descriptors：取值是对象格式，key是需要定义的属性名称，value是该属性的相关描述
            如：{
                name:{

                },
                age:{

                }
            } */

        var user={};
        var num=20;
        var u=Object.defineProperties(user,{
            name:{
                value:"cici",
                writable:true,
                enumerable:false,
                configurable:true
            },
            age:{
                get(){
                    return num;
                },
                set(value){
                    num=value;
                },
                enumerable:true,
                configurable:true
            }
        });
        console.log(user);
        console.log(u===user);//true
        console.log(user.age);

        // Object.getOwnPropertyDescriptor(object, propertyName)从一个对象中获取指定属性的相关信息(如：是否可写、可删除、可遍历)
        var nameDesc=Object.getOwnPropertyDescriptor(user,"name");
        console.log(nameDesc);
      
        // Object.getPrototypeOf(object)获取原型方法，这是ES6中新增的方法
        console.log(user.__proto__);//非标准方式
        console.log(Object.getPrototypeOf(user));

        // Object.getOwnPropertyNames(object)获取指定对象中的所有属性名称，返回一个属性名组成的数组（包含不能循环的属性）
        console.log(Object.getOwnPropertyNames(user));

        // Object.preventExtensions(object) 限定指定对象不能增加属性
        // Object.isExtensible(object)//判断指定对象是否可以新增属性
        var userA={
            name:"tom"
        };
        console.log("是否可以新增属性",Object.isExtensible(userA));
        Object.preventExtensions(userA);
        userA.age=30;
        console.log("是否可以新增属性",Object.isExtensible(userA));
        console.log(delete userA.name);
        console.log(userA);
        console.log("=====================================================");
        // Object.seal(object)限定指定对象不能增加属性,也不能删除属性
        // Object.isSealed(object)返回一个布尔值，表示这个对象是密封的
        var userB={
            name:"tom"
        };
        console.log("是否可以新增属性，也不能删除属性",Object.isSealed(userB));
        Object.seal(userB);
        userB.age=30;
        userB.sex="男";
        console.log("是否可以新增属性，也不能删除属性",Object.isSealed(userB));
        console.log(delete userB.name);
        console.log(userB);

        // Object.freeze(object)限定指定对象不能增加属性,也不能删除属性,也不能修改属性
        // Object.isFrozen(object)返回一个布尔值，表示这个对象是否已被冻结
        var userC={
            name:"tom"
        };
        console.log("对象是否被冻结",Object.isFrozen(userC));
        Object.seal(userC);
        userC.age=30;
        userC.sex="男";
        console.log("冻结该对象",Object.freeze(userC));
        console.log("对象是否被冻结",Object.isFrozen(userC));
        console.log(delete userC.name);
        userC.name="哈哈哈";
        console.log(userC);
    </script>
</head>
<body>
    
</body>
</html>